package droid.frame.utils.lang;

import android.content.Context;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

/**
 * 文件操作 <br>
 * 
 * @author coffee <br>
 *         2013-4-10下午2:51:55
 */
public class FileUtils {
	private static String enc = "UTF-8";

	/**
	 * 读取指定文件下的全部内容 ---- 以下代码会出现乱码
	 * 
	 * @param filePath
	 */
	// public static String read(String filePath) {
	// byte[] buffer = new byte[1024];
	// int len = -1;
	// StringBuilder sb = new StringBuilder();
	// BufferedInputStream bin = null;
	// try {
	// File file = new File(filePath);
	// if (file.exists() == false) {
	// return "";
	// }
	// bin = new BufferedInputStream(new FileInputStream(file));
	// while ((len = bin.read(buffer)) != -1) {
	// sb.append(new String(buffer, 0, len));
	// }
	// } catch (IOException e) {
	// e.printStackTrace();
	// } finally {
	// if (bin != null) {
	// try {
	// bin.close();
	// } catch (IOException e) {
	// e.printStackTrace();
	// }
	// }
	// }
	// return sb.toString();
	// }

	/**
	 * 读取指定文件下的全部内容
	 * .BufferedInputStream读取的是字节byte,因为一个汉字占两个字节,而当中英文混合的时候,有的字符占一个字节
	 * ,有的字符占两个字节,所以如果直接读字节,而数据比较长,没有一次读完的时候,很可能刚好读到一个汉字的前一个字节,
	 * 这样,这个中文就成了乱码,后面的数据因为没有字节对齐
	 * ,也都成了乱码.所以我们需要用BufferedReader来读取,它读到的是字符,所以不会读到半个字符的情况,不会出现乱码
	 * 
	 * @param filePath
	 */
	public static String read(String filePath) {
		String line = null;
		StringBuilder sb = new StringBuilder();
		BufferedReader br = null;
		try {
			File file = new File(filePath);
			if (file.exists() == false) {
				return "";
			}
			br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
			while ((line = br.readLine()) != null) {
				sb.append(line);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (br != null) {
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return sb.toString();
	}

	/**
	 * 
	 */
	public static void write(String filePath, String data) {
		BufferedOutputStream bout = null;
		try {
			File file = new File(filePath);
			if (file.exists() == false) {
				if (file.getParentFile().exists() == false) {
					file.getParentFile().mkdirs();
				}
				file.createNewFile();
			}
			bout = new BufferedOutputStream(new FileOutputStream(file, false));
			bout.write(data.getBytes());
			bout.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (bout != null) {
				try {
					bout.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 创建文件或者目录<br>
	 * 注意：需要权限 android.permission.WRITE_EXTERNAL_STORAGE<br>
	 * 
	 * @param path
	 * @return
	 */
	public static File createNewFileOrDir(String path) {
		File file = new File(path);
		try {
			path = decode(path);
			if (file.exists() == false) {
				if (file.isDirectory()) {
					file.mkdirs();
				} else {// 创建多级目录
					String parentPath = path.substring(0, path.lastIndexOf("/"));
					File parent = new File(parentPath);
					if (parent.exists() == false) {
						parent.mkdirs();
					}
					file.createNewFile();
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return file;
	}

	/**
	 * 删除文件或者目录以及其下的子目录
	 * 
	 * @param filePath
	 * @return
	 */
	public static boolean delFileOrDir(String filePath) {
		boolean bool = true;
		File f = new File(filePath);// 定义文件路径
		if (f.exists() && f.isDirectory()) {// 判断是文件还是目录
			if (f.listFiles().length == 0) {// 若目录下没有文件则直接删除
				f.delete();
			} else {// 若有则把文件放进数组，并判断是否有下级目录
				File delFile[] = f.listFiles();
				int i = f.listFiles().length;
				for (int j = 0; j < i; j++) {
					if (delFile[j].isDirectory()) {
						bool = bool && delFileOrDir(delFile[j].getAbsolutePath());// 递归调用del方法并取得子目录路径
					}
					bool = bool && delFile[j].delete();// 删除文件
				}// end for
			}
		}
		return bool;
	}

	/**
	 * 两个参数均为绝对路径
	 * 
	 * @param from
	 * @param to
	 */
	public static boolean copy(String from, String to) {
		BufferedInputStream in = null;
		BufferedOutputStream out = null;
		try {
			File fileIn = createNewFileOrDir(from);
			File fileOut = createNewFileOrDir(to);
			in = new BufferedInputStream(new FileInputStream(fileIn));
			out = new BufferedOutputStream(new FileOutputStream(fileOut));
			byte[] data = new byte[1024 * 8];
			int len = -1;
			while ((len = in.read(data)) != -1) {
				out.write(data, 0, len);
			}
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		} finally {
			try {
				if (in != null) {
					in.close();
				}
				if (out != null) {
					out.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return true;
	}

	/**
	 * 解密文件路径 一般用于将%20等符号转化为空格，等
	 * 
	 * @param path
	 *            :
	 * @return : 返回解码后的文件路径
	 */
	private static String decode(String path) {
		try {
			path = URLDecoder.decode(path, enc);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return path;
	}

	public static File getSaveFile(Context context) {
		File file = new File(context.getFilesDir(), "pic.jpg");
		return file;
	}

}
